package _05thread;

/**
 * @description: 迅雷
 * @author: songtao@cskaoyan.onaliyun.com
 **/
/*1. 用多线程代码来模拟，迅雷用3个线程下载100M资源的的过程。

 每个线程每次，一次下载1兆(M)资源，直到下载完毕，即剩余的待下载资源大小为0

 (用一个整数表示资源大小，每次个线程每次下载多少兆(M), 剩余待下载资源就减少多少兆(M)，

  模拟我们售票的代码实现，考虑多线程的数据安全问题)*/
public class Work5 {
    public static void main(String[] args) {

        // 创建Ruunable对象表示下载任务

        DownloadRunnable downloadTask = new DownloadRunnable();



        //开启3个线程，执行下载任务

        new Thread(downloadTask).start();

        new Thread(downloadTask).start();

        new Thread(downloadTask).start();


    }
}


class DownloadRunnable implements Runnable {


    //待下载的100M资源

    int remaining = 100;


    private Object lockObj = new Object();

    /**
     * 在子线程中执行的下载任务的实现代码
     */

    @Override
    public void run() {
        //模拟下载过程所需要的时间延迟
        while (remaining > 0) {
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //模拟成功下载资源
            synchronized (lockObj) {

                if (remaining > 0) {

                    //注意因为这里是还剩下的资源，代码执行到这里，我们认为已经下载了1M了，所以输出的是 --remaining

                    System.out.println(Thread.currentThread().getName() + "下载了1M资源，还剩" + --remaining

                            + "M资源待下载");

                    if (remaining == 0) {

                        System.out.println("下载完毕");
                        //return;
                    }

                }

            }

        }

    }



}